总结
sh是一份命令语言规范,而bash/zsh/fish/dash是规范的实现。- 查看使用
sh真正的应用程序:ls -lah /bin/sh或find -L /bin -samefile /bin/sh
提问
- [x] 1.
sh与bash的区别是什么。见 Difference between sh and Bashsh是规范,bash是其实现,但在部分POSIX系统中没有bash,他们也有自己对sh的实现使得命令可以正常运行。 - [x] 2. 如何找到
sh真正的应用程序是哪个,比如bash还是dashls -lah /bin/sh或find -L /bin -samefile /bin/sh
1. 前提提要、场景
每次使用 ssh 登录服务器,都有个命令行窗口供我们使用,别人服务器的窗口花里胡哨的,自己服务器的却平平无奇,这是为什么呢?
了解完 sh 便心中有答案。
2. sh 命令解释器
sh (全称 Shell Command Language): 是由 Shell Command Language 表述的一份规范。而 bash/zsh/fish/dash 等是基于该规范的实现。
但 sh 的规范有些简陋,因此 bash/zsh 不仅实现了基本功能,甚至对 sh 进行了功能的扩展。(在 sh 规范中并没有数组,在 bash/zsh 中均对数组进行了实现。)
在前端,
ESMAScript是一份规范,而在Node.js与浏览器环境中的Javascript/Typescript是对它的实现。
3. /bin/sh 软硬链接
sh 仅仅是一份语言规范,在我们执行 sh 命令时,实际上是在其实现的应用程序 bash/dash 上执行命令。
- 在大部分操作系统中
/bin/sh链接指向/bin/bash,即bash - 在
ubuntu/debian操作系统中/bin/sh链接指向/bin/dash,即dash
以下命令可以查询目前使用的 sh 应用程序
sh
# 大部分操作系统是软连接
$ ls -lah /bin/sh
lrwxrwxrwx 1 root root 4 Jul 27 2021 /bin/sh -> bash
# 有些操作系统是通过硬链接方式
# -L: 搜寻结果包括路径中的软连接下的结果
$ find -L /bin -samefile /bin/sh
/bin/bash
/bin/sh
4. Shebang 脚本中指定
在脚本中可以指定 sh/bash/dash 应用程序去运行脚本
sh
#!/bin/sh
#!/bin/bash
#!/bin/dash